package mr.ali.video.web.controller;

import mr.ali.video.web.service.TencentCosService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.text.Collator;
import java.util.*;

/**
 * 腾讯云COS控制器
 */
@RestController
@RequestMapping("/api/cos")
public class TencentCosController {

    private static final Logger logger = LoggerFactory.getLogger(TencentCosController.class);

    @Autowired
    private TencentCosService tencentCosService;

    /**
     * 获取文件的临时访问URL
     *
     * @param fileName 文件名
     * @param expireTime URL有效期（秒），默认3600秒（1小时）
     * @return 文件的临时访问URL
     */
    @GetMapping("/url")
    public ResponseEntity<Map<String, Object>> getFileUrl(
            @RequestParam String fileName,
            @RequestParam(required = false, defaultValue = "3600") Long expireTime) {

        try {
            // 检查文件是否存在
            if (!tencentCosService.doesFileExist(fileName)) {
                logger.warn("文件 {} 不存在", fileName);
                Map<String, Object> errorResponse = new HashMap<>();
                errorResponse.put("error", "文件不存在");
                return ResponseEntity.status(HttpStatus.NOT_FOUND)
                        .body(errorResponse);
            }

            // 获取文件的临时访问URL
            String fileUrl = tencentCosService.getFileUrl(fileName, expireTime);

            Map<String, Object> response = new HashMap<>();
            response.put("url", fileUrl);
            response.put("expireTime", expireTime);

            return ResponseEntity.ok(response);

        } catch (Exception e) {
            logger.error("获取文件URL失败: {}", e.getMessage(), e);
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("error", "获取文件URL失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(errorResponse);
        }
    }

    /**
     * 获取文件内容和信息
     *
     * @param fileName 文件名
     * @return 文件内容和信息
     */
    @GetMapping("/info")
    public ResponseEntity<?> getFileInfo(@RequestParam String fileName) {
        try {
            // 检查文件是否存在
            if (!tencentCosService.doesFileExist(fileName)) {
                logger.warn("文件 {} 不存在", fileName);
                Map<String, Object> errorResponse = new HashMap<>();
                errorResponse.put("error", "文件不存在");
                return ResponseEntity.status(HttpStatus.NOT_FOUND)
                        .body(errorResponse);
            }

            // 获取文件内容和信息
            Map<String, Object> fileInfo = tencentCosService.getFileContentAndUrl(fileName);

            // 移除二进制内容，避免在JSON响应中返回
            fileInfo.remove("content");

            return ResponseEntity.ok(fileInfo);

        } catch (Exception e) {
            logger.error("获取文件信息失败: {}", e.getMessage(), e);
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("error", "获取文件信息失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(errorResponse);
        }
    }

    /**
     * 下载文件内容
     *
     * @param fileName 文件名
     * @return 文件内容
     */
    @GetMapping("/download")
    public ResponseEntity<?> downloadFile(@RequestParam String fileName) {
        try {
            // 检查文件是否存在
            if (!tencentCosService.doesFileExist(fileName)) {
                logger.warn("文件 {} 不存在", fileName);
                Map<String, Object> errorResponse = new HashMap<>();
                errorResponse.put("error", "文件不存在");
                return ResponseEntity.status(HttpStatus.NOT_FOUND)
                        .body(errorResponse);
            }

            // 获取文件内容和信息
            Map<String, Object> fileInfo = tencentCosService.getFileContentAndUrl(fileName);

            // 获取文件内容
            byte[] content = (byte[]) fileInfo.get("content");

            // 设置响应头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.parseMediaType((String) fileInfo.getOrDefault("contentType", MediaType.APPLICATION_OCTET_STREAM_VALUE)));
            headers.setContentLength((Long) fileInfo.getOrDefault("contentLength", (long) content.length));
            headers.setContentDispositionFormData("attachment", fileName);

            return new ResponseEntity<>(content, headers, HttpStatus.OK);

        } catch (Exception e) {
            logger.error("下载文件失败: {}", e.getMessage(), e);
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("error", "下载文件失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(errorResponse);
        }
    }

    /**
     * 列出指定文件夹内的所有文件及其CDN加速地址
     *
     * @param folderPath 文件夹路径
     * @return 文件列表及其CDN加速地址
     */
    @GetMapping("/list")
    public ResponseEntity<?> listFilesInFolder(@RequestParam String folderPath) {
        try {
            logger.info("列出文件夹内容: {}", folderPath);

            // 获取文件夹内的所有文件
            List<Map<String, Object>> allFilesList = tencentCosService.listFilesInFolder(folderPath);

            // 只保留.mp4后缀的文件
            List<Map<String, Object>> mp4FilesList = new ArrayList<>();
            for (Map<String, Object> fileInfo : allFilesList) {
                String objectKey = (String) fileInfo.get("key");
                if (objectKey != null && objectKey.toLowerCase().endsWith(".mp4")) {
                    // 使用自定义加速域名
                    fileInfo.put("cdnUrl", String.format("https://app.erkantv.cn/%s", objectKey));
                    mp4FilesList.add(fileInfo);
                }
            }

            // 按文件名中的数字部分排序
            mp4FilesList.sort((m1, m2) -> {
                try {
                    // 提取文件名中的数字部分（如"1.mp4"中的1）
                    int num1 = extractNumberFromFileName((String) m1.get("key"));
                    int num2 = extractNumberFromFileName((String) m2.get("key"));
                    return Integer.compare(num1, num2);
                } catch (Exception e) {
                    logger.warn("文件名格式异常，使用默认排序: {}", e.getMessage());
                    return 0;
                }
            });

            Map<String, Object> response = new HashMap<>();
            response.put("folderPath", folderPath);
            response.put("files", mp4FilesList);
            response.put("count", mp4FilesList.size());

            return ResponseEntity.ok(response);

        } catch (Exception e) {
            logger.error("列出文件夹内容失败: {}", e.getMessage(), e);
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("error", "列出文件夹内容失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(errorResponse);
        }
    }

    // 从文件名中提取数字部分（如"1.mp4" -> 1）
    private int extractNumberFromFileName(String fileName) {
        // 移除路径和扩展名
        String baseName = fileName.substring(fileName.lastIndexOf('/') + 1, fileName.lastIndexOf('.'));
        return Integer.parseInt(baseName);
    }


//    @GetMapping("/list")
//    public ResponseEntity<?> listFilesInFolder(@RequestParam String folderPath) {
//        try {
//            logger.info("列出文件夹内容: {}", folderPath);
//
//            // 获取文件夹内的所有文件
//            List<Map<String, Object>> allFilesList = tencentCosService.listFilesInFolder(folderPath);
//
//            // 只保留.mp4后缀的文件
//            List<Map<String, Object>> mp4FilesList = new ArrayList<>();
//            for (Map<String, Object> fileInfo : allFilesList) {
//                String objectKey = (String) fileInfo.get("key");
//                if (objectKey != null && objectKey.toLowerCase().endsWith(".mp4")) {
//                    // 使用自定义加速域名
//                    fileInfo.put("cdnUrl", String.format("https://app.erkantv.cn/%s", objectKey));
//                    mp4FilesList.add(fileInfo);
//                }
//            }
//
//            Map<String, Object> response = new HashMap<>();
//            response.put("folderPath", folderPath);
//            response.put("files", mp4FilesList);
//            response.put("count", mp4FilesList.size());
//
//            return ResponseEntity.ok(response);
//
//        } catch (Exception e) {
//            logger.error("列出文件夹内容失败: {}", e.getMessage(), e);
//            Map<String, Object> errorResponse = new HashMap<>();
//            errorResponse.put("error", "列出文件夹内容失败: " + e.getMessage());
//            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
//                    .body(errorResponse);
//        }
//    }

    /**
     * 获取文件的CDN加速地址
     *
     * @param fileName 文件名（对象键）
     * @return 文件的CDN加速地址
     */
    @GetMapping("/cdn-url")
    public ResponseEntity<?> getCdnUrl(@RequestParam String fileName) {
        try {
            logger.info("获取文件的CDN加速地址: {}", fileName);
            
            // 检查文件是否存在
            if (!tencentCosService.doesFileExist(fileName)) {
                logger.warn("文件 {} 不存在", fileName);
                Map<String, Object> errorResponse = new HashMap<>();
                errorResponse.put("error", "文件不存在");
                return ResponseEntity.status(HttpStatus.NOT_FOUND)
                        .body(errorResponse);
            }
            
            // 获取文件的CDN加速地址
            String cdnUrl = tencentCosService.getCdnUrl(fileName);
            
            Map<String, Object> response = new HashMap<>();
            response.put("fileName", fileName);
            response.put("cdnUrl", cdnUrl);
            
            return ResponseEntity.ok(response);
            
        } catch (Exception e) {
            logger.error("获取文件的CDN加速地址失败: {}", e.getMessage(), e);
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("error", "获取文件的CDN加速地址失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(errorResponse);
        }
    }

}
